担当するプロジェクトの中で、最近はGitHubで進めるプロジェクトが多くなりました。以前はECSをAWS CodePipelineを利用してビルドとデプロイを行っていましたが、GitHubで進めるプロジェクトはAWS CodePipelineより、GitHub Actionsが管理も楽だし値段も安いなと思ったため、CodePipelineからGitHub Actionsへ移行することを決めました。
AWS CodePipeline vs GitHub ActionsCodePipelineとGitHub Actionsの特徴の比較は以下になります。AWS CodePipelineGitHub Actions作成コスト$1無料ソースコードCodeCommit,GitHub, BitbucketなどなどGitHubブランチ一つのブランチ多数のブランチコード管理CDKとbuildspec.ymlyml(workflow)無料利用枠100分/月(CodeBuildの無料枠)アクティブなパイプラインを 1 か月あたり 1 つ無料(CodePipeline無料枠)
Free – 2,000分/月Pro – 3,000分/月Team – 3,000分/月料金$0.010/分(CodeBuildインスタンス – general1.medium)$0.008/分 (Linux virtual machines)デプロイAWSのみどこでもCodeBuild Pricing:https://aws.amazon.com/jp/codebuild/pricing/CodePipeline Pricing:https://aws.amazon.com/jp/codepipeline/pricing/GitHub Actions Pricing:https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actionsAbout GitHub-hosted runners:https://docs.github.com/ja/actions/using-github-hosted-runners/about-github-hosted-runners GitHub Actionsが料金も安いし、無料枠の時間も長いためお得な感じですね。あとは、GitHub Actionsはworkflowのymlだけ管理すれば良いため、管理もしやすいイメージです。AWSだけではなく、GCPやAzureなどにもデプロイできるのは大きいメリットだと思います。変更前 – AWS CodePipelineでECSのビルドとデプロイを行う既存のプロジェクトではBitbucketを使うケースが多くありました。そのため、以下の順でビルドとデプロイを行っていました。BitbucketのコードをAWS CodeCommitへミラーリングする特定のブランチへのプッシュをトリガーにCodeBuildが走ってECR用のイメージ作成イメージ作成後、ECSへデプロイする手順だけ見れば簡単にも見えますが、管理をCDKで行い、あとはCodeBuildを利用するためにbuildspec.ymlも作成する必要がありました。123456789101112131415161718192021222324# buildspec.ymlversion: 0.2 phases: install: runtime-versions: docker: 18 pre_build: commands: - echo Logging in to Amazon ECR... - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION) - REPOSITORY_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME} - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build --build-arg AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} -t $REPOSITORY_URI:latest . - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - docker push $REPOSITORY_URI:latest - docker push $REPOSITORY_URI:$IMAGE_TAGCDKは省略します。変更後 – GitHub ActionsでECSのビルドとデプロイを行うGitHub Actionsでは特定のブランチへのプッシュをトリガーにActionsのWorkflowが走るイメージビルドとデプロイを行うで終わり。簡単ですね。Workflowのymlファイルは1234567891011121314151617181920212223242526272829303132jobs: build-deploy: name: Build-Delpoy runs-on: ubuntu-latest environment: environmentName steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ env.AWS_REGION }} - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: Build, tag, and push image to Amazon ECR id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: ${{ github.sha }} run: | docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:latest . docker tag $ECR_REGISTRY/$ECR_REPOSITORY:latest $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest aws ecs update-service --cluster $ECS_CLUSTER --service $ECS_SERVICE --force-new-deploymentになります。インスタンス内でAWSへログインして、Docker イメージのビルドを行ったあと、AWS CLIでそのイメージをECRへプッシュ、ECSへデプロイする流れになります。管理もこのymlファイル一つで終わるため簡単です。デプロイ後それをSlackに通知するジョブを付ければ完璧ですね。実際に移行して運用してみた感想今後CDKの管理はしなくてもよい点がかなり魅力的ですね。あとは、GitHubでプルリクエストのマージ後、すぐActionの動作を確認できることも楽でした。今後AWS LambdaもCDKで管理する必要なく、GitHubで管理が出来ると思っています。share:Facebook で共有するにはクリックしてください (新しいウィンドウで開きます)クリックして X で共有 (新しいウィンドウで開きます)